#include <mips/regdef.h>

#define REG_FP	4
#define REG_GP	0	

#define SSIZE	8

#define ARG0	8
#define ARG1	12
#define ARG2	16
	
	.text
	.align	2
	.globl	count
	.ent	count

count:
	subu	sp,sp,SSIZE
	
	sw	$fp,REG_FP(sp)		#Saved Registers Area.
	sw	gp, REG_GP(sp)
	move	$fp, sp

					#Argument building area.
	sw	a0, ARG0($fp)		#ARG0=caracter
	sw	a1, ARG1($fp)		#ARG1=contadores
	sw	a2, ARG2($fp)		#ARG2=inword

	la	t0, separadores 	#Cargo la direccion de la cadena separadores
	lbu	t2, ARG0($fp)		#Cargo en t2 el caracter pasado como argumento
	lw	t6, ARG1($fp)		#Cargo la direccion del array de contadores en t7

separadores_loop:
	lbu	t1, 0(t0)
	beqz	t1, no_es_separador	#Si recorri todos los separadores y no lo encontre, no es un separador
	bne	t1, t2, loop_continue	#Si no es el separador actual, sigo revisando los otros separadores
	
	la	t3, newline		
	lbu	t4, 0(t3)		#Cargo el newline en t4

	bne	t2, t4, no_es_newline	#Chequeo si es un newline
	
	lw	t5, 4(t6)		#t4=contadores[1]
	addiu	t5, t5, 1		#t4++
	sw	t5, 4(t6)		#contadores[0]=t4 O sea, estoy sumando a la cantidad de lineas
	
no_es_newline:
	li	v0, 0
	b	loop_return
	
loop_continue:
	addiu	t0, t0, 1

	b	separadores_loop

no_es_separador:
	lw	t3, ARG2($fp)		

	bnez	t3, loop_return		#No es un separador, me fijo si inword es 0
	
	lw	t5, 0(t6)		#t5=contadores[0]
	addiu	t5, t5, 1		#t5++
	sw	t5, 0(t6)		#contadores[0]=t5 O sea, estoy sumando a la cantidad de palabras

	li	v0, 1			#Devolvemos inword=1

loop_return:

	lw	t5, 8(t6)		#t4=contadores[2]
	addiu	t5, t5, 1		#t4++
	sw	t5, 8(t6)		#contadores[2]=t4 O sea, estoy sumando a la cantidad de caracteres

	move	sp, $fp	
	lw	$fp, REG_FP(sp)
	addiu	sp, sp, SSIZE
	jr	ra
	
	.end count

.data
	separadores: .asciiz ".,;- \t\n"
	newline: .ascii "\n"
